Первые шаги с MongoDB
Разработчику
Аналитику
Тестировщику
Архитектору
Инженеру
Установка системы MongoDB
Процесс установки СУБД требует выполнения действий в зависимости от операционной системы пользователя. Для работы с базой данных необходим серверный компонент (mongod) и клиентские утилиты (mongosh).
Требования к системе
- Операционная система: Windows, Linux (Debian/Ubuntu/CentOS) или macOS.
- Права администратора на машине.
- Доступ к интернету для загрузки установочных пакетов.
- Минимум 2 ГБ оперативной памяти.
Алгоритм установки
Вариант А: Установка на Windows
- Перейдите на официальный сайт проекта MongoDB.
- Скачайте последний стабильный дистрибутив для Windows Community Server.
- Запустите файл установки.
- Следуйте инструкциям мастера установки:
- Выберите тип установки «Complete» для установки всех компонентов, включая инструменты командной строки и GUI (MongoDB Compass).
- Укажите путь к директории установки.
- Настройте параметры запуска службы. Рекомендуется выбрать «Run as a service», чтобы MongoDB запускалась автоматически при загрузке системы.
- Укажите порт подключения (стандартное значение — 27017).
- Завершите установку и откройте приложение MongoDB Compass для визуального управления данными.
Вариант Б: Установка на Linux (на примере Ubuntu/Debian)
Откройте терминал и выполните следующие команды для добавления репозитория и установки пакета:
wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
sudo apt-get update
sudo apt-get install -y mongodb-org
После завершения установки проверьте статус службы:
sudo systemctl status mongod
Для входа в интерактивную оболочку используйте команду:
mongosh
Вариант В: Использование Docker (универсальный способ)
Создание контейнера с базой данных позволяет изолировать среду разработки:
docker run --name mongo \
-d \
-p 27017:27017 \
mongo:latest
Подключение к контейнеру выполняется командой:
docker exec -it mongo mongosh
Создание базы данных
База данных в MongoDB представляет собой логическое хранилище для коллекций документов. В отличие от реляционных систем, база данных создается неявно при первом сохранении документа.
Командный способ
Выполните команду в терминале или через клиент mongosh:
use company_db;
Если база company_db не существует, она будет создана автоматически после первого вставки документа.
Графический способ (MongoDB Compass)
- Откройте MongoDB Compass и подключитесь к локальному серверу.
- Нажмите кнопку «Create Database».
- Введите имя базы
company_db. - Укажите имя коллекции (например,
employees). - Нажмите кнопку «Create Database».
Важно помнить, что каждая новая база данных имеет собственную схему, которая формируется динамически по мере добавления данных.
Создание коллекции и вставка документов
Коллекция — это аналог таблицы в реляционных базах данных, но она хранит документы в формате BSON (бинарный JSON). Структура документа определяется пользователем.
Синтаксис вставки документа
Используйте метод insertOne для добавления одного документа или insertMany для нескольких.
db.employees.insertOne({
_id: ObjectId("65e8f1a2b3c4d5e6f7g8h9i0"),
first_name: "Ivan",
last_name: "Ivanov",
email: "ivanov@example.com",
hire_date: ISODate("2024-01-15"),
salary: 75000.00,
department_id: 1,
skills: ["JavaScript", "Python"],
is_active: true
});
Анализ компонентов определения
- _id: Уникальный идентификатор документа. Если поле не указано явно, MongoDB генерирует его автоматически в виде объекта
ObjectId. - first_name, last_name: Текстовые поля произвольной длины.
- email: Поле для адреса электронной почты.
- hire_date: Тип данных
Date, хранящий временную метку. - salary: Числовое поле типа
NumberDecimalилиDouble. - department_id: Целочисленное поле для связи с другими данными.
- skills: Массив строк, позволяющий хранить список значений в одном документе.
- is_active: Булево поле (
trueилиfalse).
Вставка нескольких документов
db.employees.insertMany([
{
first_name: "Maria",
last_name: "Petrova",
email: "petrova@example.com",
hire_date: ISODate("2024-02-10"),
salary: 82000.00,
department_id: 2,
skills: ["Java", "Spring"],
is_active: true
},
{
first_name: "Alexey",
last_name: "Sidorov",
email: "sidorov@example.com",
hire_date: ISODate("2024-03-01"),
salary: 65000.00,
department_id: 1,
skills: ["C#", ".NET"],
is_active: false
}
]);
Добавление ограничений и индексов
Ограничения целостности в MongoDB реализуются через валидацию схем (Schema Validation), а индексы ускоряют поиск информации.
Валидация схемы (Constraints)
Валидация определяет правила, которым должны соответствовать документы в коллекции. Это достигается через настройку правил валидации при создании коллекции.
Создайте коллекцию с правилами валидации:
db.createCollection("employees", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["first_name", "last_name", "salary"],
properties: {
first_name: {
bsonType: "string",
description: "Имя сотрудника обязательно"
},
last_name: {
bsonType: "string",
description: "Фамилия сотрудника обязательна"
},
email: {
bsonType: "string",
pattern: "^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$",
description: "Должен быть корректный формат email"
},
salary: {
bsonType: "number",
minimum: 0,
description: "Зарплата должна быть неотрицательным числом"
},
department_id: {
bsonType: "int",
minimum: 1
}
}
}
}
});
При попытке вставить документ, нарушающий эти правила, система вернет ошибку.
Создание индекса
Индекс — это структура данных, которая ускоряет операции выборки. Индексируются часто используемые поля поиска или сортировки.
Создание индекса по фамилии сотрудников:
db.employees.createIndex({ last_name: 1 });
Создание составного индекса для ускорения поиска по отделу и зарплате:
db.employees.createIndex({ department_id: 1, salary: -1 });
Создание уникального индекса для поля email:
db.employees.createIndex({ email: 1 }, { unique: true });
Использование индексов снижает время выполнения запросов, особенно на больших объемах данных.
Выполнение CRUD запросов
CRUD (Create, Read, Update, Delete) — набор операций для управления данными.
Создание записей (Create)
Вставка новых сотрудников уже рассмотрена выше. Также можно использовать метод save, который обновляет документ, если _id существует, или создает новый, если нет.
Чтение данных (Read)
Выборка всех записей:
db.employees.find();
Выборка конкретных полей с фильтрацией:
db.employees.find(
{ salary: { $gt: 70000 } }, // Где зарплата больше 70000
{ first_name: 1, last_name: 1, salary: 1, _id: 0 } // Только эти поля
);
Сортировка результатов:
db.employees.find().sort({ salary: -1 }); // Сортировка по убыванию зарплаты
Поиск по массиву:
db.employees.find({ skills: "Python" }); // Найдутся сотрудники со skill "Python"
Обновление данных (Update)
Изменение зарплаты сотрудника:
db.employees.updateOne(
{ _id: ObjectId("...") }, // Фильтр
{ $set: { salary: 80000.00 } } // Операция обновления
);
Обновление нескольких полей одновременно:
db.employees.updateMany(
{ department_id: 1 },
{ $inc: { salary: 5000 } } // Увеличить зарплату на 5000 всем в отделе 1
);
Добавление элемента в массив:
db.employees.updateOne(
{ first_name: "Ivan" },
{ $push: { skills: "Docker" } }
);
Удаление данных (Delete)
Удаление конкретного сотрудника:
db.employees.deleteOne({ _id: ObjectId("...") });
Удаление всех записей из коллекции:
db.employees.deleteMany({});
Удаление всей коллекции:
db.employees.drop();
Создание представлений (Views)
Представление в MongoDB — это виртуальная таблица, созданная на основе пайплайна агрегации. Представления не хранят данные физически, а вычисляют их при обращении.
Простое представление
Создание представления со списком сотрудников и их зарплатами:
db.createView("employee_salary_view", "employees", [
{
$lookup: {
from: "departments",
localField: "department_id",
foreignField: "_id",
as: "dept_info"
}
},
{
$unwind: "$dept_info"
},
{
$project: {
first_name: 1,
last_name: 1,
department_name: "$dept_info.name",
salary: 1
}
}
]);
Использование представления:
db.employee_salary_view.find({ salary: { $gt: 75000 } });
Преимущества использования View
- Упрощение сложных запросов.
- Сокрытие деталей реализации физических коллекций.
- Контроль доступа к определенным полям.
- Стандартизация логики выборки данных.
Создание функций и процедур с агрегатными функциями и Join
В MongoDB нет триггеров в классическом понимании как в SQL, но есть возможности для автоматизации через агенты и функции агрегации. Процедурная логика реализуется через скрипты на JavaScript, выполняемые на стороне сервера.
Функция с агрегатными функциями
Функция рассчитывает среднюю зарплату в отделе.
function get_avg_salary_by_department(deptId) {
return db.employees.aggregate([
{ $match: { department_id: deptId } },
{ $group: { _id: null, avgSalary: { $avg: "$salary" } } }
]).toArray()[0].avgSalary;
}
// Вызов функции
get_avg_salary_by_department(1);
Процедура с использованием пайплайна агрегации
Процедура обновляет статистику отдела при добавлении нового сотрудника. В данном случае мы создадим скрипт, который выполняет группировку и подсчет.
db.employees.aggregate([
{
$lookup: {
from: "departments",
localField: "department_id",
foreignField: "_id",
as: "dept"
}
},
{
$unwind: "$dept"
},
{
$group: {
_id: "$dept.name",
emp_count: { $sum: 1 },
total_salary: { $sum: "$salary" },
avg_salary: { $avg: "$salary" }
}
},
{
$project: {
_id: 0,
department_name: "$_id",
employee_count: "$emp_count",
total_fund: "$total_salary",
average_salary: "$avg_salary"
}
}
]).forEach(function(doc) {
print("Отдел: " + doc.department_name + ", Количество сотрудников: " + doc.employee_count + ", Общий фонд: " + doc.total_fund);
});
Триггерная логика (Validation Rules)
Хотя явных триггеров BEFORE INSERT нет, можно использовать валидацию схемы для проверки условий перед вставкой.
Пример проверки: зарплата не может быть отрицательной. Это правило уже включено в секцию «Валидация схемы» выше через $jsonSchema и условие minimum: 0.
При попытке вставки документа с отрицательной зарплатой система вернет ошибку валидации:
db.employees.insertOne({
first_name: "Test",
last_name: "User",
salary: -5000
});
// Ошибка: Document validation failed for document ...
Для более сложной логики можно использовать триггеры на уровне приложения или использовать MongoDB Change Streams для отслеживания изменений в реальном времени и запуска внешних обработчиков.